package be.ipl.abeille.testNG;

import static org.testng.Assert.*;

import java.util.Calendar;
import java.util.GregorianCalendar;

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import be.ipl.abeille.domaine.Joueur;
import be.ipl.abeille.domaine.Partie;
import be.ipl.abeille.domaine.Const.Difficulte;
import be.ipl.abeille.domaine.Partie.EtatJeu;
import be.ipl.abeille.exceptions.ActionIncorrecteException;
import be.ipl.abeille.exceptions.BizException;
import be.ipl.abeille.exceptions.EtatPartieIncorrectException;

public class Joueur_Tests {
	
	private static Joueur j1 = new Joueur("Lio", "a123456");
	private static Joueur j2 = new Joueur("Est", "b123456");
	private static Joueur j3 = new Joueur ("Ant", "c123456");
	
	Calendar dateDebut = new GregorianCalendar();
	Partie p1 = new Partie("partie de test 1", dateDebut, Difficulte.FACILE);

	@BeforeClass
	public static void init(){
		j1.setId(1);
		j2.setId(2);
		j3.setId(3);
	}
	
	@Test(groups="g1")
	public void testGet(){
		assertEquals("Lio", j1.getPseudo());
		assertEquals("a123456", j1.getPassword());
		assertEquals("partie de test 1", p1.getNomPartie());
		assertEquals(dateDebut, p1.getDateDebut());
		assertEquals(Difficulte.FACILE, p1.getDifficulte());
		assertEquals(EtatJeu.EN_ATTENTE, p1.getEtat());
		assertEquals(null, p1.getDateFin());
	}
	
	@Test(groups="g2")
	public void testEtatPartie(){
		assertFalse(p1.commencerPartie());
		assertFalse(p1.finirPartie());
		assertFalse(p1.isPartieFinie());
	}
	
	@Test(groups="g2", expectedExceptions=EtatPartieIncorrectException.class)
	public void testGetLog() throws BizException{
		p1.getLog();
	}
	
	@Test(groups="g3", dependsOnGroups="g2")
	public void testInscriptionPartie(){
		assertTrue(p1.ajouterJoueur(j1));
		assertEquals(EtatJeu.EN_ATTENTE,p1.getEtat());
		assertEquals(1,p1.getGrilles().size());
		assertTrue(p1.ajouterJoueur(j2));
		assertEquals(2,p1.getGrilles().size());
	}
	
	@Test(groups="g3")
	public void testAnnulation(){
		Partie p2 = new Partie("seconde partie", new GregorianCalendar(), Difficulte.FACILE);
		p2.ajouterJoueur(j1);
		assertTrue(p2.annulerPartie());
		
		Partie p3 = new Partie("troisieme partie", new GregorianCalendar(), Difficulte.FACILE);
		p3.ajouterJoueur(j1);
		p3.ajouterJoueur(j2);
		assertFalse(p2.annulerPartie());
	}
	
	@Test(groups="g4", dependsOnGroups="g3")
	public void testQuitterPartie(){
		assertFalse(p1.retirerJoueur(j3));
		assertTrue(p1.ajouterJoueur(j3));
		assertTrue(p1.retirerJoueur(j3));
	}
	
	@Test(groups="g5", dependsOnGroups="g4")
	public void testCommencerPartie(){
		assertTrue(p1.commencerPartie());
		assertEquals(p1.getNumeroTour(), 1);
	}
	
	@Test(groups="g6", dependsOnGroups="g5")
	public void jouerTour1_j1(){
		try {
			p1.placerTuile(j1, 0);
			//p1.jouerTuile(j2,0);
		} catch (BizException e) {
			assertTrue(false);
		}
	}
	
	@Test(groups="g7", dependsOnGroups="g6", expectedExceptions = ActionIncorrecteException.class)
	public void jouerTour1_exc1() throws BizException {
		p1.placerTuile(j1, 5);
	}
	
	@Test(groups="g7", dependsOnGroups="g6", expectedExceptions = ActionIncorrecteException.class)
	public void jouerTour1_exc2() throws BizException {
		p1.placerTuile(j3, 5);
	}
	
	@Test(groups="g8", dependsOnGroups="g7")
	public void jouerTour1_j2() {
		try {
			p1.placerTuile(j2, 0);
		} catch (BizException e) {
			assertTrue(false);
		}
	}
	
	@Test(groups="g9", dependsOnGroups="g8")
	public void jouerToursRestants() {
		try{
			for(int i = 1; i < 20; i++){
				assertEquals(p1.getNumeroTour(),i+1);System.out.println("Tour n " + p1.getNumeroTour());
				System.out.println("j1 place la piece " +  p1.getPiocheCourrante() + " en " + i);
				p1.placerTuile(j1, i);
				System.out.println("j2 place la piece " +  p1.getPiocheCourrante() + " en " + i);
				p1.placerTuile(j2, i);
			}
		} catch(BizException e){
			e.printStackTrace();
			assertTrue(false);
		}
		assertEquals(EtatJeu.TERMINEE, p1.getEtat());
		assertTrue(p1.getDateFin() != null);
		try {
			System.out.println(p1.getLog());
		} catch (BizException e) {
			e.printStackTrace();
		}
	}
	
	
	
	
	
	
}
